package top.byfree.jbyan.saber.controller

import cn.dev33.satoken.annotation.SaCheckPermission
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.validation.BindException
import org.springframework.validation.FieldError
import org.springframework.validation.annotation.Validated
import org.springframework.web.bind.annotation.*
import top.byfree.jbyan.saber.bean.dto.FilterMenuDto
import top.byfree.jbyan.saber.bean.dto.MenuDto
import top.byfree.jbyan.saber.bean.dto.UserDto
import top.byfree.jbyan.saber.common.AddGroup
import top.byfree.jbyan.saber.common.R
import top.byfree.jbyan.saber.common.ok
import top.byfree.jbyan.saber.common.result
import top.byfree.jbyan.saber.exception.SaberServiceException
import top.byfree.jbyan.saber.service.MenuService

/**
 * 菜单控制器
 *
 * @author jbyan
 * @since 2024/4/20
 */
@RestController
@RequestMapping("menu")
class MenuController(
    @Autowired
    private val menuService: MenuService
) {

    @GetMapping("route")
    fun routeMenus() = ok(data = menuService.currentRouteMenus())

    /**
     * 分页条件获取菜单列表
     *
     * 限拥有 sys:menu:cat 权限用户调用
     *
     * @param size 每页数据个数
     * @param current 当前业
     */
    @PostMapping("page/{size}/{current}")
    @SaCheckPermission("sys:menu:cat")
    fun page(
        @PathVariable size: Int,
        @PathVariable current: Int,
        @RequestBody filterMenuDto: FilterMenuDto
    ) = ok(data = menuService.page(size, current, filterMenuDto))

    /**
     * 根据菜单id获取菜单详细信息
     *
     * 限拥有 sys:menu:cat 权限用户调用
     *
     * @param menuId 菜单Id
     */
    @GetMapping("{menuId}")
    @SaCheckPermission("sys:menu:cat")
    fun get(@PathVariable menuId: String)
    = menuService.getOne(menuId)?.let { ok(data = it) } ?: throw SaberServiceException("获取菜单Id不存在")

    /**
     * 新增菜单
     *
     * @param menuDto 菜单详情
     */
    @PutMapping
    fun add(
        @RequestBody @Validated(AddGroup::class) menuDto: MenuDto
    ): R<Boolean> {
        return result(menuService.add(menuDto))
    }

    /**
     * 修改指定菜单信息
     *
     * 限拥有 sys:menu:update 权限的用户调用
     *
     * @param menuDto 用户修改请求实体
     */
    @PostMapping("{menuId}")
    @SaCheckPermission("sys:menu:update")
    fun update(
        @PathVariable menuId: String,
        @Validated @RequestBody menuDto: MenuDto
    ): Any? {
        return result(menuService.update(menuId, menuDto))
    }

//    /**
//     * 删除指定用户
//     *
//     * 限制拥有 sys:user:delete 权限的用户调用
//     *
//     * @param userId 用户Id
//     */
//    @DeleteMapping("{userId}")
//    @SaCheckPermission("sys:user:delete")
//    fun delete(
//        @PathVariable userId: String
//    ) = result(userService.delete(mutableListOf(userId)))

}